#ifndef __GLOBAL_H__
#define __GLOBAL_H__
#include <cstdint>
#include <functional>
#include <memory>

#define MAX_LENGTH 4096  //缓存区大小
#define HEAD_TOTAL_LEN 4 //头部总长度
#define HEAD_ID_LEN 2   //头部id长度2字节
#define HEAD_DATA_LEN 2  //头部段2字节长度字


// 状态机管理
enum class RecvStage {
    NO_RECV,       // 未开始接收
    HEAD_RECVING,  // 接收头部中
    BODY_RECVING   // 接收体中
};
// 发送状态枚举
enum class SendStage {
    NO_SEND,       // 未发送
    SENDING        // 发送中
};

// IO操作返回码
enum IOStatus {
    IO_SUCCESS = 0,
    IO_EAGAIN = 1,
    IO_ERROR = -1,
    IO_CONTINUE = 2 
};

// 任务类型
enum class TaskType {
    RegisterConn,  // 注册新连接
    SendData,      // 发送数据
    Shutdown       // 关闭线程
};

class Session;
class RecvNode;
class IOThread;
#define MAX_RECVQUE  10000
#define MAX_SENDQUE 1000


#define HEARTBEAT_INTERVAL 5000         //心跳包发送间隔5 秒
#define HEARTBEAT_TIMEOUT 30         //心跳超时阈值15 秒

// 逻辑节点类
struct LogicNode {
    LogicNode(std::shared_ptr<Session> session, std::shared_ptr<RecvNode> recv_node)
        : _session(session), _recv_node(recv_node) {}
    
    std::shared_ptr<Session> _session;
    std::shared_ptr<RecvNode> _recv_node;
};


// 定义消息类型
enum MessageType {
    TEST = 1000,
    MSG_PING = 9998,    // 心跳请求
    MSG_PONG = 9999,    // 心跳响应

};


// 消息回调函数类型（Session指针 + 消息ID + 消息体）
using MsgCallback = std::function<void(std::shared_ptr<Session>, size_t, const std::string&)>;

#endif


// {
//     "id": 1000,          // 消息ID，必须与消息头中的ID一致（此处1对应TEST业务）
//     "data": "hello"   // 业务数据，可自定义内容
// }
